package com.freemalll.merchant.utils;

import org.springframework.stereotype.Component;

import java.time.LocalDate;
import java.time.Period;
import java.time.format.DateTimeFormatter;
import java.time.format.DateTimeParseException;
import java.time.temporal.ChronoUnit;
@Component
public class DateUtil {


    public static final String Y_M_D = "yyyy-MM-dd";
    public static final String YMD = "yyyyMMdd";


    /**
     * 生日日期格式转换
     * @param yearStr 年
     * @param monthStr 月
     * @param dayStr 日
     * @return yyyy-MM-dd
     */
    public String formatBirthDate(String yearStr, String monthStr, String dayStr) {
        int year = Integer.parseInt(yearStr);
        int month = Integer.parseInt(monthStr);
        int day = Integer.parseInt(dayStr);
        return String.format("%04d-%02d-%02d", year, month, day);
    }

    /**
     * 获取当前日期
     * @return
     */
    public String getCurrentDate() {
        // 获取当前日期
        LocalDate currentDate = LocalDate.now();
        // 定义格式：yyyyMMdd
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern(YMD);
        // 格式化成字符串
        return currentDate.format(formatter);
    }


    /**
     * 判断传入的日期字符串是否在多少个月内
     *
     * @param dateStr 日期字符串，例如："2025-04-09" 或 "2017年05月19日"
     * @param month   多少个月
     * @return true 表示在近一年内，false 表示不是
     */
    public boolean isWithinOneYear(String dateStr, int month) {
        try {
            DateTimeFormatter formatter = DateTimeFormatter.ofPattern(Y_M_D);
            LocalDate inputDate = LocalDate.parse(dateStr, formatter);
            LocalDate now = LocalDate.now();

            // 计算两个日期之间的月份数（取绝对值）
            long monthsBetween = Math.abs(ChronoUnit.MONTHS.between(inputDate, now));

            return monthsBetween <= month && !inputDate.isAfter(now);
        } catch (DateTimeParseException e) {
            // 日期格式不合法时返回 false
            return false;
        }
    }

    /**
     * 获取日期字符串 yyyy-MM-dd 格式
     *
     * @param localDate 日期
     * @return
     */
    public String getDateStr(LocalDate localDate) {
        // 定义格式化器
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern(Y_M_D);
        // 格式化为字符串
        return localDate.format(formatter);
    }

    /**
     * 获取当前日期与传入日期之间的天数差
     *
     * @param date 日期
     * @return
     */
    public int getValidDays(String date) {
        // 定义日期格式
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern(Y_M_D);
        // 将输入字符串解析为 LocalDate
        LocalDate inputDate = LocalDate.parse(date, formatter);
        // 获取当前日期（不包含时间）
        LocalDate currentDate = LocalDate.now();
        // 计算两个日期之间的天数差 取绝对值确保正数
        return Math.abs((int) ChronoUnit.DAYS.between(inputDate, currentDate));
    }

    /**
     * 获取当前日期与传入日期之间的月数差
     *
     * @param dateStr 日期
     * @return
     */
    public int getMonthsBetween(String dateStr) {
        // 定义日期格式
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern(Y_M_D);
        // 将字符串解析为 LocalDate
        LocalDate inputDate = LocalDate.parse(dateStr, formatter);
        // 获取当前日期
        LocalDate currentDate = LocalDate.now();
        // 计算两个日期之间的月份数（精确到月）
        return Math.abs((int) ChronoUnit.MONTHS.between(inputDate, currentDate));
    }

    /**
     * 获取两个日期之间的月数差
     *
     * @param start 开始日期
     * @param end   结束日期
     * @return
     */
    public int getMonthsBetween(String start, String end) {
        // 定义日期格式
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern(Y_M_D);
        // 将字符串解析为 LocalDate
        LocalDate inputDate = LocalDate.parse(start, formatter);
        // 获取当前日期
        LocalDate currentDate = LocalDate.parse(end, formatter);
        // 计算两个日期之间的月份数（精确到月）
        return Math.abs((int) ChronoUnit.MONTHS.between(inputDate, currentDate));
    }

    /**
     * 计算两个日期之间的年数差
     *
     * @param startDateStr 开始日期
     * @param endDateStr   结束日期
     * @return
     */
    public int calculateYearsBetween(String startDateStr, String endDateStr) {
        // 定义日期格式
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern(Y_M_D);
        // 解析日期字符串
        LocalDate startDate = LocalDate.parse(startDateStr, formatter);
        LocalDate endDate = LocalDate.parse(endDateStr, formatter);

        // 确保 startDate 不晚于 endDate
        if (startDate.isAfter(endDate)) {
            LocalDate temp = startDate;
            startDate = endDate;
            endDate = temp;
        }

        // 计算两个日期之间的年数
        Period period = Period.between(startDate, endDate);
        return period.getYears();
    }

    /**
     * 计算出生日期的年龄
     *
     * @param birthDateStr 出生日期字符串，格式为 "yyyy-MM-dd"
     * @return
     */
    public int calculateAge(String birthDateStr) {
        // 定义日期格式
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern(Y_M_D);
        // 将字符串解析为 LocalDate
        LocalDate birthDate = LocalDate.parse(birthDateStr, formatter);
        // 获取当前日期
        LocalDate currentDate = LocalDate.now();
        // 计算年龄
        return Period.between(birthDate, currentDate).getYears();
    }
}
